﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tilver.ConsoleTest.Model
{
    /*
    代理模式（Proxy）
    为其他对象提供一种代理以控制对这个对象的访问。

    代理模式结构
    1.Subject类，定义了RealSubject和Proxy的公用接口，这样就在任何使用RealSubject的地方都可以调用Proxy。
    2.RealSubject类，定义Proxy所代表的真实实体。
    3.Proxy类，保存一个应用使得代理可以访问实体，并提供一个与Subject的接口相同的接口，这样代理就可以替代实体。
     
     * 代理模式 应用场景：
     一、远程代理，也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
     二、虚拟代理，是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
     三、安全代理，用来控制真实的对象访问时的权限。
     四、智能指引，是指当调用真实的对象时，代理处理另外一些事。
     总结：代理模式其实就是在访问对象时引入一定程度的间接性，可以附加多种用途。（代理是真实对象的代表）
     */

    public abstract class Subject
    {
        public abstract void Request();
    }

    public class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真实请求");
        }
    }

    public class Proxy : Subject
    {
        RealSubject realSubject;
        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = new RealSubject();
            }
            realSubject.Request();
        }
    }
}
